java使用poi读写word中的图片(二)

您所在的位置:网站首页 java poi word转图片 java使用poi读写word中的图片(二)

java使用poi读写word中的图片(二)

2022-05-10 09:05| 来源: 网络整理| 查看: 265

文章目录准备工作简单读取复杂读取查看Word的XML特别说明:Word中的Svg图片第一种写入图片到Word中的方式第二种写入图片到Word中的方式最后

准备工作

这里就不在复述了,可以看上一篇博文 java使用poi读写word中的内容(包含表格内容)(一)

代码中MyUnits工具类在我另一篇博文中 word中各种长度转换为px(工具类)

简单读取

如果后期还有回写到word中不建议使用这种方式读取。

@Test public void test() throws FileNotFoundException, IOException { XWPFDocument document = new XWPFDocument(new FileInputStream("D:\Test\word\test1.docx")); try { List paragraphs = document.getParagraphs(); for (XWPFParagraph paragraph : paragraphs) { List runs = paragraph.getRuns(); for (XWPFRun run : runs) { List pictures = run.getEmbeddedPictures(); // 我这里是偷懒,请使用循环 XWPFPicture picture = pictures.get(0); XWPFPictureData pictureData = picture.getPictureData(); System.out.println(pictureData.getPictureType()); System.out.println(pictureData.getFileName()); System.out.println(pictureData.getData()); } } } finally { document.close(); } }

上面代码中,可以直接取出word中的图片,但是无法取出图片在word中的大小此处要注意,word中图片的大小可能与图片的大小不一致操作word你就知道,图片放入word中后是可以放大或缩小的

复杂读取 @Test public void test1() throws FileNotFoundException, IOException { XWPFDocument document = new XWPFDocument(new FileInputStream("D:\Test\word\test1.docx")); try { List paragraphs = document.getParagraphs(); for (XWPFParagraph paragraph : paragraphs) { List runs = paragraph.getRuns(); for (XWPFRun run : runs) { Node node = run.getCTR().getDomNode(); // drawing 一个绘画的图片 Node drawingNode = getChildNode(node, "w:drawing"); if (drawingNode == null) { continue; } // 绘画图片的宽和高 Node extentNode = getChildNode(drawingNode, "wp:extent"); NamedNodeMap extentAttrs = extentNode.getAttributes(); System.out.println("宽:".concat(extentAttrs.getNamedItem("cx").getNodeValue()).concat("emu")); System.out.println("高:".concat(extentAttrs.getNamedItem("cy").getNodeValue()).concat("emu")); // 绘画图片具体引用 Node blipNode = getChildNode(drawingNode, "a:blip"); NamedNodeMap blipAttrs = blipNode.getAttributes(); String rid = blipAttrs.getNamedItem("r:embed").getNodeValue(); System.out.println("word中图片ID:".concat(rid)); // 获取图片信息 PackagePart part = document.getPartById(rid); System.out.println(part.getContentType()); System.out.println(part.getPartName().getName()); System.out.println(part.getInputStream()); System.out.println("------ run ------"); } System.out.println("------ paragraph ------"); } } finally { document.close(); } } private Node getChildNode(Node node, String nodeName) { if (!node.hasChildNodes()) { return null; } NodeList childNodes = node.getChildNodes(); for (int i = 0; i 第一种写入图片到Word中的方式

注意:这种方式写入图片,宽高单位必须是emu

@Test public void test2() throws IOException, InvalidFormatException { XWPFDocument document = new XWPFDocument(); try { XWPFParagraph paragraph = document.createParagraph(); XWPFRun run = paragraph.createRun(); InputStream is = new FileInputStream("D:\Test\word\aa.png"); // 因为FileInputStream没有重写reset() 所有将流转为了byte数组 byte[] bs = IOUtils.toByteArray(is); BufferedImage image = ImageIO.read(new ByteArrayInputStream(bs)); int width = MyUnits.pxToEMU(image.getWidth()); int height = MyUnits.pxToEMU(image.getHeight()); run.addPicture(new ByteArrayInputStream(bs), Document.PICTURE_TYPE_PNG, "", width, height); OutputStream stream = new FileOutputStream("D:\Test\word\w_test.docx"); document.write(stream); } finally { document.close(); } }

看看写入的效果在这里插入图片描述

第二种写入图片到Word中的方式

相对第一种这种方式要复杂一点注意:这种方式写入图片的宽高in、mm、cm、pt、px都可以使用,我这里用的是pt.

@Test public void test3() throws IOException { XWPFDocument document = new XWPFDocument(); try { XWPFParagraph paragraph = document.createParagraph(); XWPFRun run = paragraph.createRun(); // 获取图片 InputStream is = new FileInputStream("D:\Test\word\aa.png"); byte[] bs = IOUtils.toByteArray(is); BufferedImage image = ImageIO.read(new ByteArrayInputStream(bs)); // 获取组装图片宽高,单位pt StringBuffer dataSize = new StringBuffer(); dataSize.append("width:").append(MyUnits.pxToPt(image.getWidth())).append("pt;"); dataSize.append("height:").append(MyUnits.pxToPt(image.getHeight())).append("pt;"); // 添加图片到Word中 String rid = document.addPictureData(bs, Document.PICTURE_TYPE_PNG); StringBuffer xml = new StringBuffer(); xml.append("rn"); xml.append(" rn"); xml.append(" "); xml.append(" rn"); xml.append(""); InputSource source = new InputSource(new StringReader(xml.toString())); org.w3c.dom.Document pictDoc = DocumentHelper.readDocument(source); // 将信息写入run中 run.setEmbossed(true); XmlObject xmlObject = XmlObject.Factory.parse(pictDoc.getDocumentElement(), POIXMLTypeLoader.DEFAULT_XML_OPTIONS); run.getCTR().set(xmlObject); OutputStream stream = new FileOutputStream("D:\Test\word\w_test1.docx"); document.write(stream); } catch (Exception e) { e.printStackTrace(); } finally { document.close(); } }

看看写入效果在这里插入图片描述

最后

如果有什么不明白的可以留言。 欢迎大家留言讨论。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3